package tech.waterism.model.dto;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

/**
 * DHF模型参数
 * 
 * <p>包含产流参数、汇流参数、流域特征参数等</p>
 * 
 * @author 高宇
 * @since 2025-11-13
 */
public class DHFModelParameters {
    
    // ==================== 蓄水容量参数 ====================
    
    /** 上层蓄水容量 (mm) */
    @JsonProperty("S0")
    private Double S0;
    
    /** 下层蓄水容量 (mm) */
    @JsonProperty("U0")
    private Double U0;
    
    /** 地下水蓄水容量 (mm) */
    @JsonProperty("D0")
    private Double D0;
    
    // ==================== 产流参数 ====================
    
    /** 下层下渗曲线曲率系数 */
    @JsonProperty("K2")
    private Double K2;
    
    /** 前期净雨影响衰减系数 */
    @JsonProperty("KA")
    private Double KA;
    
    /** 流域蒸散发折算系数 */
    @JsonProperty("K")
    private Double K;
    
    /** yL与RL的比值 */
    @JsonProperty("KW")
    private Double KW;
    
    /** 不透水面积比例 */
    @JsonProperty("G")
    private Double G;
    
    /** 表层蓄水容量分布曲线形状参数 */
    @JsonProperty("A")
    private Double A;
    
    /** 下渗率抛物线形状系数 */
    @JsonProperty("B")
    private Double B;
    
    // ==================== 汇流参数 ====================
    
    /** 特征河长比例系数 */
    @JsonProperty("B0")
    private Double B0;
    
    /** 汇流曲线底宽求解指数 */
    @JsonProperty("K0")
    private Double K0;
    
    /** 地下地面汇流曲线底宽比例系数 */
    @JsonProperty("N")
    private Double N;
    
    /** 流域最大河长 (km) */
    @JsonProperty("L")
    private Double L;
    
    /** 地表汇流曲线形状参数DD */
    @JsonProperty("DD")
    private Double DD;
    
    /** 地表汇流曲线形状参数CC */
    @JsonProperty("CC")
    private Double CC;
    
    /** 峰现时间参数 */
    @JsonProperty("COE")
    private Double COE;
    
    /** 地下汇流曲线形状参数DDL */
    @JsonProperty("DDL")
    private Double DDL;
    
    /** 地下汇流曲线形状参数CCL */
    @JsonProperty("CCL")
    private Double CCL;
    
    /** 流域面积 (km²) */
    @JsonProperty("F")
    private Double F;
    
    /** 时段长 (h) */
    @JsonProperty("clen")
    private Double clen;
    
    /** 月潜在蒸散发 (12个月) */
    @JsonProperty("monthlyPET")
    private List<MonthlyPET> monthlyPET;

    public DHFModelParameters() {
    }

    // Getters and Setters

    public Double getS0() {
        return S0;
    }

    public void setS0(Double s0) {
        S0 = s0;
    }

    public Double getU0() {
        return U0;
    }

    public void setU0(Double u0) {
        U0 = u0;
    }

    public Double getD0() {
        return D0;
    }

    public void setD0(Double d0) {
        D0 = d0;
    }

    public Double getK2() {
        return K2;
    }

    public void setK2(Double k2) {
        K2 = k2;
    }

    public Double getKA() {
        return KA;
    }

    public void setKA(Double KA) {
        this.KA = KA;
    }

    public Double getK() {
        return K;
    }

    public void setK(Double k) {
        K = k;
    }

    public Double getKW() {
        return KW;
    }

    public void setKW(Double KW) {
        this.KW = KW;
    }

    public Double getG() {
        return G;
    }

    public void setG(Double g) {
        G = g;
    }

    public Double getA() {
        return A;
    }

    public void setA(Double a) {
        A = a;
    }

    public Double getB() {
        return B;
    }

    public void setB(Double b) {
        B = b;
    }

    public Double getB0() {
        return B0;
    }

    public void setB0(Double b0) {
        B0 = b0;
    }

    public Double getK0() {
        return K0;
    }

    public void setK0(Double k0) {
        K0 = k0;
    }

    public Double getN() {
        return N;
    }

    public void setN(Double n) {
        N = n;
    }

    public Double getL() {
        return L;
    }

    public void setL(Double l) {
        L = l;
    }

    public Double getDD() {
        return DD;
    }

    public void setDD(Double DD) {
        this.DD = DD;
    }

    public Double getCC() {
        return CC;
    }

    public void setCC(Double CC) {
        this.CC = CC;
    }

    public Double getCOE() {
        return COE;
    }

    public void setCOE(Double COE) {
        this.COE = COE;
    }

    public Double getDDL() {
        return DDL;
    }

    public void setDDL(Double DDL) {
        this.DDL = DDL;
    }

    public Double getCCL() {
        return CCL;
    }

    public void setCCL(Double CCL) {
        this.CCL = CCL;
    }

    public Double getF() {
        return F;
    }

    public void setF(Double f) {
        F = f;
    }

    public Double getClen() {
        return clen;
    }

    public void setClen(Double clen) {
        this.clen = clen;
    }

    public List<MonthlyPET> getMonthlyPET() {
        return monthlyPET;
    }

    public void setMonthlyPET(List<MonthlyPET> monthlyPET) {
        this.monthlyPET = monthlyPET;
    }

    @Override
    public String toString() {
        return "DHFModelParameters{" +
                "S0=" + S0 +
                ", U0=" + U0 +
                ", D0=" + D0 +
                ", K2=" + K2 +
                ", KA=" + KA +
                ", K=" + K +
                ", KW=" + KW +
                ", G=" + G +
                ", A=" + A +
                ", B=" + B +
                ", B0=" + B0 +
                ", K0=" + K0 +
                ", N=" + N +
                ", L=" + L +
                ", DD=" + DD +
                ", CC=" + CC +
                ", COE=" + COE +
                ", DDL=" + DDL +
                ", CCL=" + CCL +
                ", F=" + F +
                ", clen=" + clen +
                ", monthlyPET=" + (monthlyPET != null ? monthlyPET.size() + " months" : "null") +
                '}';
    }
}
